#ifndef VECTORPROTEGIDO_H_
#define VECTORPROTEGIDO_H_

#include <vector>
#include "../Common/Mutex.h"
#include "Lock.h"

template <class T>
class VectorProtegido {
private:
	std::vector<T> vec;
	Mutex mutex;

public:
	
	//Agrega un elemento.
	void pushBack(const T& e);
	
	//Sobrecarga del operador [] para poder manejar indices.
	T& operator[](const unsigned& pos);
	
	//Devuelve el tamanio.
	unsigned size();
	
	//Borra un elemento dada una posicion.
	void borrar(const unsigned& pos);
	
	//Borra todos los elementos.
	void vaciar();
};

template<class T>
void VectorProtegido<T>::pushBack(const T& e)
{
	Lock lock(mutex);
	vec.push_back(e);
}

template<class T>
T& VectorProtegido<T>::operator [](const unsigned & pos)
{
	Lock lock(mutex);
	return vec[pos];
}

template<class T>
unsigned VectorProtegido<T>::size()
{
	Lock lock(mutex);
	return vec.size();
}

template<class T>
void VectorProtegido<T>::borrar(const unsigned & pos)
{
	Lock lock(mutex);
	vec.erase(vec.begin()+pos);
}

template<class T>
void VectorProtegido<T>::vaciar()
{
	Lock lock(mutex);
	vec.erase(vec.begin(), vec.end());
}

#endif /* VECTORPROTEGIDO_H_ */

